package cn.wolfcode.luowowo.listener;

import cn.wolfcode.luowowo.domain.Strategy;
import cn.wolfcode.luowowo.redis.service.IStrategyStatiesVORedisService;
import cn.wolfcode.luowowo.redis.vo.StrategyStatisVO;
import cn.wolfcode.luowowo.service.IStrategyService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * redis数据初始化的监听器（为什么选择监听器？为什么要在mgr项目中创建初始化监听器）
 * spring容器准备好之后，马上将需要初始化的数据准备好
 * 将mongodb数据vo加载到redis中，用户访问更流畅
 */
//@Component  //需要交给spring管理
public class RedisDataInitListener implements ApplicationListener<ContextRefreshedEvent>{

    @Autowired
    private IStrategyService strategyService;

    @Autowired
    private IStrategyStatiesVORedisService strategyStatiesVORedisService;


    //初始化逻辑：spring容器创建完成（aop、ioc、di）之后立即执行初始化的逻辑
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        System.out.println("++++++++++初始化开始++++++++++");

        //需要初始化的数据：vo中的统计数据（阅读量、点赞、分享、评论、顶数等）
        //1.从mongodb中将数据查出来
        List<Strategy> list = strategyService.list();

        //2.将查到的vo数据保存到Redis中完成初始化
        for (Strategy strategy : list) {
            StrategyStatisVO vo = new StrategyStatisVO();
            BeanUtils.copyProperties(strategy, vo);
            vo.setStrategyId(strategy.getId());

            //必须的判断：如果vo在Redis中已经存在，那么我们初始化化的时候必须跳过，而不能覆盖（防止数据丢失）
            if (strategyStatiesVORedisService.isVoExist(strategy.getId())){
                //如果已经存在，就跳过
                continue;
            }

            //将vo添加进Redis中
            strategyStatiesVORedisService.setStrategyStatisVo(vo);
        }

        System.out.println("++++++++++初始化结束++++++++++");
    }
}
